/**
 * 新版的chrome版本中，对象内属性的数量没有限制了。
 * 旧版本V8 有一种策略：如果命名属性少于等于 10 个时，命名属性会直接存储到对象本身，而无需先通过 properties 指针查询
 * 构造函数内，手动赋予三个索引属性会导致properties消失(原因不明)
 * properties是有序的连续的，不连续的不会在properties中
 * 块属性与慢属性  https://segmentfault.com/a/1190000042337607
 */

function testV8(properties,elements) {
    // for (let i = 0; i < elements; i++) {
    //     this[i] = `element${i}`
    // }

    
    this[1] = 'test-1'

    this[2] = 'test-50'

    // this[9] = 'test-9'
    // this[8] = 'test-8'
    // this[3] = 'test-3'
    // this[5] = 'test-5'
    // this["4"] = 'test-4' // 整型key


    this[4.5] = "foo-4.5" // 非整型key

    this["A"] = 'foo-A'
    this["C"] = 'foo-C'
    this["D"] = 'foo-D' // 字符串key
    this["B"] = 'foo-B'
    this["e"] = 'foo-e'
    this["f"] = 'foo-f'
    this["g"] = 'foo-g'
    this["h"] = 'foo-h'
    this["i"] = 'foo-i'
    this["j"] = 'foo-j'
    this["k"] = 'foo-k'

    // for (let i = 0; i < properties; i++) {
    //     const prop = `property${i}`
    //     this[prop] = prop
    // }
}

const testObj = new testV8(12,100)

for (const key in testObj) {
    console.log(`key:${key}, value:${testObj[key]}`)
}

function Foo(properties, elements) {
    //添加可索引属性
    for (let i = 0; i < elements; i++) {
        this[i] = `element${i}`
    }

    //添加常规属性
    for (let i = 0; i < properties; i++) {
        const prop = `proper${i}`
        this[prop] = prop
    }
}
const foo = new Foo(12, 12)